/**
 * 重写会导致数组改变的一些方法
 * push pop shift unshift reverse sort splice
 */

const oldArrayMethods = Array.prototype;
export const arrayMethods = Object.create(oldArrayMethods);
// 要重写方法
`push pop shift unshift reverse sort splice`.split(" ").forEach((method) => {
	// 改写原来的方法
	arrayMethods[method] = function (...args) {
		// 执行原来的方法并且获取返回值
		const result = oldArrayMethods[method].apply(this, args);
		let inserted; // 当前操作的元素
		// 拿到当前的Observe对象
		const ob = this.__ob__;
		switch (method) {
			case "push":
			case "unshift":
				inserted = args;
				break;
			case "splice": // 会有3个值,拿最后一个 splice(0,1,{})
				inserted = args.splice(2);
				break;
			default:
				break;
		}
		// 如果有插入的值,就递归劫持插入的值
		if (inserted) ob.observerArray(inserted);
		// 数组变化通知
		ob.dep.notify()
		// 返回操作结果
		return result;
	};
});
